#ifndef MOSES_VALUE_H
#define MOSES_VALUE_H

#include <string>
#include "Type.h"

namespace moses
{
	
	class Value
	{
	public:
					Value(Type type);
	
		explicit	Value(int);
		explicit	Value(float);
		explicit	Value(const char*);
		explicit	Value(const std::string&);
	
					Value(const Value&);
					~Value();
	
		Value&		operator=(const Value&);
	
		bool		operator==(const Value&)		const;
		bool		operator!=(const Value &v)		const	{ return !operator==(v); }
		bool		operator<(const Value &v)		const;
		bool		operator>(const Value &v)		const	{ return operator!=(v) && !operator<(v);  }
		bool		operator<=(const Value &v)		const	{ return operator<(v) || operator==(v); }
		bool		operator>=(const Value &v)		const	{ return !operator<(v); }
	
		const Value operator+(const Value&)			const;
		const Value operator-(const Value&)			const;
		const Value operator*(const Value&)			const;
		const Value operator/(const Value&)			const;
		const Value	operator-()						const;
	
		Type		GetType()						const	{ return m_type; }
	
		bool		ToBoolean()						const;
		int			ToInt()							const;
		float		ToFloat()						const;
		std::string	ToString()						const;
	
		static int	BaseToDec(const char* ch, int base);
	
	private:
		explicit	Value(bool);
	
		union
		{
			bool			v_boolean;
			int				v_int;
			float			v_float;
			std::string*	v_string;
		} m_value;
	
		Type				m_type;
	};
}

#endif
